package controller;

import dao.EmpregadoDAO;
import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import business.EmpregadoBO;
import business.EmpregadoException;
import model.Empregado;

public class EmpregadoServlet extends BaseServlet {
	
    public EmpregadoServlet() {
        super();
    }

    /**
     * Método executado antes de apresentar a tela de inclusão do empregado.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void antesIncluir(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;

        try {
            rd = request.getRequestDispatcher("incluir.jsp");
        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação anterior a inclusão de empregado.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado ao submeter o formulário da tela de inclusão do empregado.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void incluir(HttpServletRequest request, HttpServletResponse response) throws Exception, EmpregadoException {

        RequestDispatcher rd = null;

        String mensagem = null;
        String mensagemErro = null;

        try {

            Empregado empregado = new Empregado();
            empregado.setNome(request.getParameter("nome"));
            empregado.setSexo(request.getParameter("sexo"));
            empregado.setSalario(request.getParameter("salario"));
            empregado.setCpf(request.getParameter("cpf"));
            empregado.setDataNascimento(request.getParameter("dataNascimento"));
            empregado.setDataAdmissao(request.getParameter("dataAdmissao"));
            empregado.setDataDesligamento(request.getParameter("dataDesligamento"));

            try {
                EmpregadoBO.getInstance().incluiEmpregado(empregado);
                mensagem = "Empregado cadastrado com sucesso!";
                request.setAttribute("mensagem", mensagem);
            }
            catch (EmpregadoException e) {
                mensagemErro = e.getMessage();
                request.setAttribute("mensagemErro", mensagemErro);
            }

            rd = request.getRequestDispatcher("incluir.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de incluir empregado.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }
    }

    /**
     * Método executado ao selecionar a edição de um empregado na tela de listagem de empregados.
     * 
     * @param request
     * @param response
     * @throws IOException
     */
    protected void antesAlterar(HttpServletRequest request, HttpServletResponse response) throws Exception {

        RequestDispatcher rd = null;

        try {
            
            String id = request.getParameter("id");
            request.setAttribute("id", id);

            Empregado empregado = EmpregadoDAO.getInstance().consultar(Long.valueOf(id));
            request.setAttribute("empregado", empregado);

            rd = request.getRequestDispatcher("editar.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação anterior a alteração de empregado.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado ao submeter o formulário da tela de edição do empregado.
     * 
     * @param request
     * @param response
     * @throws IOException
     */
    protected void alterar(HttpServletRequest request, HttpServletResponse response) throws Exception {

        RequestDispatcher rd = null;
        String mensagem = null;
        String mensagemErro = null;

        try {

            String id = request.getParameter("id");
            Empregado antigoEmpregado = EmpregadoDAO.getInstance().consultar(Long.valueOf(id));

            Empregado novoEmpregado = new Empregado();
            novoEmpregado.setNome(request.getParameter("nome"));
            novoEmpregado.setSexo(request.getParameter("sexo"));
            novoEmpregado.setSalario(request.getParameter("salario"));
            novoEmpregado.setCpf(request.getParameter("cpf"));
            novoEmpregado.setDataNascimento(request.getParameter("dataNascimento"));
            novoEmpregado.setDataAdmissao(request.getParameter("dataAdmissao"));
            novoEmpregado.setDataDesligamento(request.getParameter("dataDesligamento"));

            try {
                EmpregadoBO.getInstance().alteraEmpregado(antigoEmpregado, novoEmpregado);
                mensagem = "Alteração feita com sucesso!";
                request.setAttribute("mensagem", mensagem);
                request.setAttribute("empregado", novoEmpregado);
            }
            catch (EmpregadoException e) {
                mensagemErro = e.getMessage();
                request.setAttribute("mensagemErro", mensagemErro);
                request.setAttribute("empregado", antigoEmpregado);
            }

            request.setAttribute("id", id);

            rd = request.getRequestDispatcher("editar.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de alterar empregado.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado ao selecionar a exclusão de um empregado na tela de listagem de empregados.
     * 
     * @param request
     * @param response
     * @throws IOException
     */
    protected void excluir(HttpServletRequest request, HttpServletResponse response) throws Exception {

        RequestDispatcher rd = null;

        try {

            String id = request.getParameter("id");
            Empregado empregado = EmpregadoDAO.getInstance().consultar(Long.valueOf(id));

            EmpregadoDAO.getInstance().excluir(empregado);

            String mensagemExclusao = "Empregado excluído com sucesso!";
            request.setAttribute("mensagemExclusao", mensagemExclusao);

            rd = request.getRequestDispatcher("listar.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de excluir empregado.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado para listar todos os empregados cadastrados.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void listar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;
        String mensagem = null;

        try {
            
            List<Empregado> listaEmpregados = EmpregadoDAO.getInstance().listar();
            request.setAttribute("listaEmpregados", listaEmpregados);

            if (listaEmpregados.isEmpty()) {
                mensagem = "Nenhum empregado cadastrado.";
                request.setAttribute("mensagem", mensagem);
            }

            rd = request.getRequestDispatcher("listar.jsp");

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de listar empregados.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }
    }

    /**
     * Método executado para apresentar a tela de consulta do empregado.
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void antesConsultar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd = null;

        try {
            rd = request.getRequestDispatcher("consultar.jsp");
        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação anterior a consulta de empregados.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }

    /**
     * Método executado ao submeter o formulário da tela de consulta do empregado.
     * Se o empregado buscado estiver na lista, redireciona para a listagem com os empregados semelhantes. 
     * 
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void consultar(HttpServletRequest request, HttpServletResponse response) throws Exception {

        RequestDispatcher rd = null;
        String mensagem = null;

        try {

            Empregado empregado = new Empregado();
            empregado.setNome(request.getParameter("nome"));
            empregado.setSexo(request.getParameter("sexo"));
            empregado.setSalario(request.getParameter("salario"));
            empregado.setCpf(request.getParameter("cpf"));
            empregado.setDataNascimento(request.getParameter("dataNascimento"));
            empregado.setDataAdmissao(request.getParameter("dataAdmissao"));
            empregado.setDataDesligamento(request.getParameter("dataDesligamento"));

            List<Empregado> listaEmpregadosConsultados = EmpregadoDAO.getInstance().consultaEmpregado(empregado);

            if (!listaEmpregadosConsultados.isEmpty()) {
                request.setAttribute("listaEmpregados", listaEmpregadosConsultados);
                rd = request.getRequestDispatcher("listar.jsp");
            }
            else {
                mensagem = "Empregado não encontrado. Tente novamente.";
                request.setAttribute("mensagem", mensagem);
                rd = request.getRequestDispatcher("consultar.jsp");
            }

        } 
        catch (Exception e) {
            request.setAttribute("mensagem", "Erro na ação de consultar empregados.");
            request.setAttribute("detalhe", e.getMessage());
            rd = request.getRequestDispatcher("../erro.jsp");
        }
        finally {
            rd.forward(request, response);
        }

    }
    
}
